﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>热键 - 定义 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="Learn details about hotkeys in general, modifier symbols, context-sensitive hotkeys, custom combinations, mouse wheel hotkeys, function hotkeys, etc." />
<meta name="keywords" content="热键,hotkeys,hot key,hot keys,shortcut,shortcuts,shortcut key,shortcut keys,keyboard shortcut,keyboard shortcuts,button,buttons,点击,press">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="static/theme.css" rel="stylesheet" type="text/css" />
<script src="static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>热键<span class="headnote">(鼠标, 操纵杆和键盘快捷键)</span></h1>

<h2 id="Table_of_Contents">目录</h2>
<ul>
  <li><a href="#Intro">介绍和简单示例</a></li>
  <li><a href="#Symbols">热键修饰符</a></li>
  <li><a href="#Context">上下文相关的热键</a></li>
  <li><a href="#combo">自定义组合键</a></li>
  <li><a href="#Features">其他特性</a></li>
  <li><a href="#Wheel">鼠标滚轮热键</a></li>
  <li><a href="#Remarks">热键技巧和备注</a></li>
  <li><a href="#AltTabDetail">Alt-Tab 热键</a></li>
  <li><a href="#Function">命名的函数热键</a></li>
</ul>

<h2 id="Intro">介绍和简单示例</h2>
<p>热键有时也称为快捷键, 因为它们能简便地触发动作(例如运行程序或<a href="misc/Macros.htm">键盘宏</a>). 在下面的例子中, <kbd>Win</kbd>+<kbd>N</kbd> 被设置为启动记事本. 磅的符号 [#] 表示 <kbd>Win</kbd> 键, 它被称为 <em>修饰符</em>:</p>
<pre>#n::
{
    运行 "notepad"
}
</pre>
<p id="HotBraces">在上文中, 大括号的作用是为热键定义一个<a href="Functions.htm">函数主体</a>. 当热键被触发时, 函数被调用, 并将热键的名称(不包括后面的冒号), 作为它的第一个参数 <code>ThisHotkey</code>. 如果热键只需要执行一行, 那么这一行可以列在双冒号的右边. 换句话说, 大括号是隐式的:</p>
<pre>#n::运行 "notepad"</pre>
<p id="otb">左大括号也可与双冒号在同一行指定. 请参阅<a href="commands/Block.htm#otb">区块(One True Brace)</a>.</p>
<p>要在热键中使用多个修饰键, 那么需要把它们连续地列出来(顺序无关紧要). 下面的例子中使用 <code>^!s</code> 来表示 <kbd>Control</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>:/p>
<pre>^!s::
{
    <a href="commands/Send.htm">发送</a> "Sincerely,{enter}John Smith"  <em>; 此行发送键击到活动(最前面的) 窗口.</em>
}</pre>
<h2 id="Symbols">热键修饰符</h2>
<p>在定义热键时您可以使用下列修饰符:</p>
<table class="info fixed">
  <tr>
    <th style="width:30px">符号</th>
    <th>说明</th>
  </tr>
  <tr>
    <td><strong>#</strong></td>
    <td>
      <p><kbd>Win</kbd> (Windows 徽标键).</p>
      <p id="win-l">包含 <kbd>Win</kbd> 键的热键(例如 #a) 会等待 <kbd>Win</kbd> 键被释放后才发送任何包含 <kbd>L</kbd> 键击的文本. 这样避免了这种热键中的 <a href="commands/Send.htm">发送</a> 锁定 PC. 这种行为适用于除 <a href="commands/Send.htm#SendPlayDetail">发送模拟</a>(这里不需要), <a href="commands/Send.htm#blind">盲从模式</a>和<a href="commands/Send.htm#SendText">文本模式</a>以外的所有发送模式.</p>
      <p class="note"><strong>注意:</strong> 按下包含 <kbd>Win</kbd> 键的热键可能会导致额外的模拟击键(默认为 <kbd>Ctrl</kbd> 键). 请参阅 <a href="commands/_MenuMaskKey.htm">#掩饰键</a>.</p>
    </td>
  </tr>
  <tr>
    <td><strong>!</strong></td>
    <td>
      <p><kbd>Alt</kbd></p>
      <p class="note"><strong>注意:</strong> 按下包含 <kbd>Alt</kbd> 键的热键可能会导致额外的模拟击键(默认为 <kbd>Ctrl</kbd> 键). 请参阅 <a href="commands/_MenuMaskKey.htm">#掩饰键</a>.</p>
    </td>
  </tr>
  <tr>
    <td><strong>^</strong></td>
    <td><kbd>Control</kbd></td>
  </tr>
  <tr>
    <td><strong>+</strong></td>
    <td><kbd>Shift</kbd></td>
  </tr>
  <tr>
    <td><strong>&amp;</strong></td>
    <td>和符号可以用来组合任意两个按键或鼠标按钮, 让它们成为自定义热键. 有关详情, 请参阅<a href="#combo">下文</a>.</td>
  </tr>
  <tr id="LeftRight">
    <td><strong>&lt;</strong></td>
    <td>成对按键左边的那个按键. 例如 &lt;!a 相当于 !a, 但只有使用左边的 <kbd>Alt</kbd> 键才可以触发.</td>
  </tr>
  <tr>
    <td><strong>&gt;</strong></td>
    <td>成对按键右边的那个按键.</td>
  </tr>
  <tr id="AltGr">
    <td><strong>&lt;^&gt;!</strong></td>
    <td><p><kbd>AltGr</kbd>(译者注: 美式标准键盘上没有该键). 如果您键盘布局中含 <kbd>AltGr</kbd> 键而非右 <kbd>Alt</kbd> 键, 那么这一系列符号一般可用于表示 <kbd>AltGr</kbd>. 例如:</p>
      <pre>&lt;^&gt;!m::信息框 "你按下的是 AltGr+m."
&lt;^&lt;!m::信息框 "你按下的是 LeftControl+LeftAlt+m."</pre>
      <p>或者, 让 <kbd>AltGr</kbd> 本身成为热键, 请使用下面的热键(不像上面出现的任何热键):</p>
      <pre>LControl &amp; RAlt::信息框 "你按下的是 AltGr 本身."</pre></td>
  </tr>
  <tr id="wildcard">
    <td><strong>*</strong></td>
    <td><p>通配符: 即使额外的修饰键被按住也能触发热键. 这常与<a href="misc/Remap.htm">重映射</a>按键或按钮组合使用. 例如:</p>
      <pre>*#c::运行 "calc.exe"  <em>; Win+C, Shift+Win+C, Ctrl+Win+C, 等都会触发此热键.</em>
*ScrollLock::运行 "notepad"  <em>; 即使在按住其他修饰键时按下 ScrollLock 也会触发此热键.</em></pre>
      <p>通配符热键总是使用键盘钩子, 就像任何被通配符热键覆盖的热键一样. 例如, <code>*a::</code> 的存在会导致 <code>^a::</code> 总是使用钩子.</p></td>
  </tr>
  <tr id="Tilde">
    <td><strong>~</strong></td>
    <td><p>触发热键时,  热键中按键原有的功能不会被屏蔽(对操作系统隐藏). 在下面的两个例子中, 用户的鼠标按钮点击会被发送到活动窗口:</p>
      <pre>~RButton::信息框 "You clicked the right mouse button."
~RButton &amp; C::信息框 "You pressed C while holding down the right mouse button."</pre>
      <p>与其他前缀符号不同, 可以在热键的某些<a href="commands/_HotIf.htm#variant">变体</a>中使用颚化符(波浪号) 前缀而其他的不使用. 然而, 如果应用于颚化符(波浪号) <a href="#prefix">前缀</a>的任何自定义组合键没有被关闭或暂停, 它会影响那个前缀键在 <em>所有</em> 组合中的行为.</p>
      <p>用于替代 <a href="#alttab">alt-tab</a> 的特殊按键总是忽略颚化符(波浪号) 前缀.</p>
      <p>如果把颚化符(<a href="#prefix">前缀键</a>) 用在自定义修饰键中且此修饰键自身也作为热键, 则在按下此修饰键时会触发热键而不会被延迟到按键释放的时候. 例如, 上文中 <em>~RButton</em> 热键在按下此按键时就会触发.</p>
      <p>如果颚化符前缀只应用于自定义组合键, 而不应用于非组合热键, 按键的原生功能将持续被屏蔽. 例如, 下面的脚本, 按住 <kbd>Menu</kbd> 键将会一直显示一个 工具提示 而不会触发上下文菜单:</p>
      <pre>AppsKey::工具提示 "Press &lt; or &gt; to cycle through windows."
AppsKey Up::工具提示
~AppsKey &amp; &lt;::发送 "!+{Esc}"
~AppsKey &amp; &gt;::发送 "!{Esc}"</pre>
      <p>如果键盘热键的一个变体具有颚化修饰符, 那么热键总是使用键盘钩子.</p>
    </td>
  </tr>
  <tr id="prefixdollar">
    <td><strong>$</strong></td>
    <td>
      <p>通常只在脚本使用 <a href="commands/Send.htm">发送</a> 函数发送包含了热键自身的按键时才需要使用此符号, 此时可以避免触发它自己. $ 前缀强制使用<a href="commands/_InstallKeybdHook.htm">键盘钩子</a>来实现此热键, 作为副作用这样阻止了 <a href="commands/Send.htm">发送</a> 函数触发它自己. $ 前缀相当于在此热键定义之前的某个位置指定了 <code><a href="commands/_UseHook.htm">#强制使用钩</a></code>.</p>
      <p>$ 前缀对于鼠标热键不起作用, 因为它们始终使用鼠标钩子. 它对于已经启用了键盘钩子的热键同样无效, 包括任何带有<a href="#Tilde">颚化符(~)</a> 或<a href="#wildcard">通配符(*)</a> 修饰的热键, key-up 热键以及自定义组合. 要确定特定热键是否使用键盘钩子, 请使用 <a href="commands/ListHotkeys.htm">热键列表</a> 查看.</p>
      <p><a href="commands/_InputLevel.htm">#输入等级</a> 和 <a href="commands/SendLevel.htm">发送等级</a> 对 发送 函数是否触发热键和热字串提供了额外的控制功能.</p>
    </td>
  </tr>
  <tr id="keyup">
    <td>UP</td>
    <td><p>单词 UP 可以跟在热键名后面使得在释放按键时触发热键, 而不是按下时. 下面的例子把左 <kbd>Win</kbd> <a href="misc/Remap.htm">重映射</a>为左 <kbd>Control</kbd>:</p>
      <pre>*LWin::发送 "{LControl down}"
*LWin Up::发送 "{LControl up}"
</pre>
      <p>&quot;Up&quot; 也可以用于普通热键中, 例如: <code>^!r Up::信息框 "You pressed and released Ctrl+Alt+R"</code>. 它还可以用在<a href="#combo">组合键</a>(例如 <code>F1 &amp; e Up::</code>)</p>
      <p>限制: 1) &quot;Up&quot; 不能和<a href="KeyList.htm">游戏杆按钮</a>一起使用; 2) 在没有普通/按下热键副本的 &quot;Up&quot; 热键会完全接管那个按键以防被卡住. 避免这种情况的一种方法是添加<a href="#Tilde">颚化符(波浪号) 前缀</a>(例如 <code>~LControl up::</code>)</p>
      <p>"Up" 热键和其 key-down 副本(如果有的话) 总是使用键盘钩子.</p>
      <p>相关提示, 类似于上面的一种技术是让热键成为前缀键. 好处是尽管热键会在按键松开时激发, 但仅在您之前按住此前缀键时没有按其他任何键的情况下才会如此. 例如:</p>
      <pre>LControl &amp; F1::返回  <em>; 至少在 &quot;&amp;&quot; 前面使用左 control 键一次, 来让它成为前缀键.</em>
LControl::信息框 "You released LControl without having used it to modify any other key."</pre></td>
  </tr>
</table>
<p class="note"><strong>注意</strong>: 请参阅<a href="KeyList.htm">按键列表</a>来了解键盘按键和鼠标/操纵杆按钮的完整列表.</p>
<p>
多个热键可以垂直地叠放来让它们执行相同的动作. 例如:</p>
<pre>^Numpad0::
^Numpad1::
{
    信息框 "Pressing either Control+Numpad0 or Control+Numpad1 will display this message."
}
</pre>
<p>通过不为按键或按键组合的热键指定任何操作可以在整个系统中完全禁用它们. 下面的例子中禁用了右 <kbd>Win</kbd> 键:</p>
<pre>RWin::返回</pre>

<h2 id="Context">上下文相关的热键</h2>
<p><a href="commands/_HotIf.htm">#动态判断</a> 指令可以用来让热键根据不同的条件执行不同的动作(或什么都不做). 例如:</p>
<pre>#动态判断 窗口已激活("ahk_class Notepad")
^a::信息框 "你在记事本中按下了 Ctrl-A. 而在其他窗口中按下 Ctrl-A 将原样发送."
#c::信息框 "你在记事本中按下了 Win-C."

#动态判断
#c::信息框 "你在非记事本程序中按下了 Win-C."

#动态判断 <a href="commands/_If.htm#Examples">MouseIsOver</a>("ahk_class Shell_TrayWnd") <em>; 有关 MouseIsOver, 请参阅 <a href="commands/_HotIf.htm#ExVolume">#动态判断 的示例 1</a>.</em>
WheelUp::发送 "{Volume_Up}"     <em>; 在任务栏上滚动滚轮: 增加/减小音量.</em>
WheelDown::发送 "{Volume_Down}" <em>;</em>
</pre>

<h2 id="combo">自定义组合键</h2>
<p>通过在两个按键(不包括操纵杆按钮) 间使用 &quot; &amp; &quot; 可以定义自定义的组合键. 在下面的例子中, 您在按住 Numpad0 接着按下第二个按键时会触发此热键:</p>
<pre id="prefix">Numpad0 &amp; Numpad1::信息框 "You pressed Numpad1 while holding down Numpad0."
Numpad0 &amp; Numpad2::运行 "Notepad"</pre>
<p><strong>前缀键会失去它原有的功能:</strong> 在上面的例子中, Numpad0 为 <em>前缀键</em>; 但是这也让 Numpad0 在被按下时失去了它原有/自带的功能. 为了避免此问题, 脚本中可以配置 Numpad0 执行新的动作, 例如下列热键的其中一个:</p>
<pre>Numpad0::最大化窗口 "A"   <em>; 最大化活动/前端窗口.</em>
Numpad0::发送 "{Numpad0}"  <em>; 让 Numpad0 <i>释放</i> 时产生 Numpad0 键击. 请参阅下面的注释.</em></pre>
<p><strong>释放时触发:</strong> 使用上面的其中一个自定义组合热键可以在 <em>释放</em> Numpad0 时执行指定的动作, 但不包括按住 Numpad0 时您又按下了其他按键的情况. 可以在其中某个热键前使用<a href="#Tilde">颚化符(波浪号) 前缀</a>来避免这种行为.</p>
<p id="combo_mods"><strong>修饰:</strong> 与普通热键不同的是, 自定义组合在默认情况下表现得就像拥有一个<a href="#wildcard">通配符(*)</a> 修饰一样. 例如, <code>1 &amp; 2::</code> 当按下 <kbd>1</kbd> 和 <kbd>2</kbd> 时, 无论 <kbd>Ctrl</kbd> 或 <kbd>Alt</kbd> 是否被按住都会触发, 然而 <code>^1::</code> 仅在 <kbd>Ctrl</kbd>+<kbd>1</kbd> 组合键时触发, 而 <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>1</kbd> 不会触发.</p>
<p>对于普通的修饰键, 一般的热键会比 "自定义" 组合工作得更好. 例如, <code>&lt;+s::</code> 就是比 <code>LShift &amp; s::</code> 更好的用法.</p>
<p>不支持组合三个或更多的键. 一般来说组合键支持你键盘上物理存在的所有按键, 都可以用 <a href="commands/_HotIf.htm">#动态判断</a> 和 <a href="commands/GetKeyState.htm">获取按键状态</a> 探测状态, 但是也可能出现不一致的情况. 例如:</p>
<pre><em>; 以任何顺序按下 AppsKey 和 Alt, 然后按下反斜杠键(/).</em>
#动态判断 获取按键状态("AppsKey", "P")
Alt &amp; /::信息框 "热键 activated."

<em>; 如果对调 AppsKey 和 Alt, 则必须先按下 Alt(一次按一个):</em>
#动态判断 获取按键状态("Alt", "P")
AppsKey &amp; /::信息框 "热键 activated."

<em>; 同时按下这三个键: [ &amp; ] &amp; \::</em>
#动态判断 获取按键状态("[") &amp;&amp; 获取按键状态("]")
\::信息框</pre>
<p><strong>键盘钩子:</strong> 涉及键盘键的自定义的组合键总是使用键盘钩子, 使用前缀键作为后缀的任何热键也是如此. 例如, <code>a &amp; b::</code> 导致 <code>^a::</code> 总是使用键盘钩子.</p>

<h2 id="Features">其他特性</h2>
<p><strong>NumLock, CapsLock 和 ScrollLock:</strong> 这些键可以被强制设置为 &quot;AlwaysOn&quot; 或 &quot;AlwaysOff&quot;. 例如: <code><a href="commands/SetNumScrollCapsLockState.htm">设置小键盘锁</a> "AlwaysOn"</code>.</p>
<p><strong>覆盖资源管理器热键:</strong> 系统的内置热键(如 <kbd>Win</kbd>+<kbd>E</kbd>(#e) 和 <kbd>Win</kbd>+<kbd>R</kbd>(#r)) 可以通过将它们指定给脚本中的一个操作单独替换. 有关详情, 请参阅<a href="misc/Override.htm">覆盖页面</a>.</p>
<p id="alttab"><strong>替换 Alt-Tab:</strong> 热键可以提供 Alt-Tab 的可选方法. 例如, 下面的两个热键可以让您用右手进行 alt-tab:</p>
<pre>RControl &amp; RShift::AltTab  <em>; 按住右 control 后接着反复下右 shift 来向前移动.</em>
RControl &amp; Enter::ShiftAltTab  <em>; 甚至不需要释放右 control, 直接按 Enter 来反向移动.</em></pre>
<p>有关详情, 请参阅 <a href="#AltTabDetail">Alt-Tab</a>.</p>

<h2 id="Wheel">鼠标滚轮热键</h2>
<p>通过键名 WheelDown 和 WheelUp 可以支持转动滚轮来激发热键. 这里是一些鼠标滚轮热键的例子:</p>
<pre>MButton &amp; WheelDown::信息框 "You turned the mouse wheel down while holding down the middle button."
^!WheelUp::信息框 "You rotated the wheel up while holding down Control+Alt."</pre>
<p id="HWheel">如果鼠标支持它, 可以通过键名 WheelLeft 和 WheelRight 来检测水平滚动. 有些鼠标只有一个滚轮, 可以向上或向下滚动或向左或向右倾斜. 通常, 在这些情况下, 将滚轮固定在一侧时会重复发送 WheelLeft 或 WheelRight 信号, 以模拟连续滚动. 这通常会导致热键重复执行.</p>
<p>内置变量 <strong>内_事件信息</strong> 包含了滚轮转动的格数, 通常为 120. 但是, 内_事件信息 在以下情况下可以大于或小于 120:</p>
<ul>
  <li>如果鼠标硬件报告小于一格的距离, 那么 内_事件信息 可能小于 120;</li>
  <li>如果快速滚动滚轮(取决于鼠标的类型), 那么 内_事件信息 可能大于 120. 像后面这样的热键可以帮助您分析鼠标: <code>~WheelDown::工具提示 内_事件信息</code></li>
</ul>
<p>鼠标滚轮的一些最有用的热键包括滚动窗口文本的可选模式. 例如, 使用下面的一对热键可以在您按住左 <kbd>Control</kbd> 键并转动滚轮时进行水平滚动而不是垂直滚动:</p>
<pre>~LControl &amp; WheelUp::  <em>; 向左滚动.</em>
{
    循环 2  <em>; &lt;-- 增加这个值来加快滚动速度.</em>
        发送消息 0x114, 0, 0, 获取焦点控件("A")  <em>; 0x114 是 WM_HSCROLL, 它后面的 0 是 SB_LINELEFT.</em>
}

~LControl &amp; WheelDown::  <em>; 向右滚动.</em>
{
    循环 2  <em>; &lt;-- 增加这个值来加快滚动速度.</em>
        发送消息 0x114, 1, 0, 获取焦点控件("A")  <em>; 0x114 是 WM_HSCROLL, 它后面的 1 是 SB_LINERIGHT.</em>
}</pre>
<p>最后, 由于鼠标滚轮热键只产生按下事件(从没有弹起事件), 所以它们无法用作<a href="#keyup">弹起热键</a>.</p>

<h2 id="Remarks">热键技巧和备注</h2>
<p>根据 <kbd>NumLock</kbd> 的状态, 每个小键盘上的按键可以运行两个不同的热键子程序. 或者, 小键盘上的按键也可以运行相同的热键子程序, 而不管 <kbd>NumLock</kbd> 的状态如何. 例如:</p>
<pre>NumpadEnd::
Numpad1::
{
    信息框 "This 热键 is launched regardless of whether NumLock is on."
}
</pre>
<p>如果<a href="#Tilde">波浪号(~)</a> 与<a href="#prefix">前缀键</a>一起使用, 即使只是一次, 它会更改所有组合键的前缀键的行为. 例如, 在下面的两个热键中, 活动窗口都会接收到右键点击, 尽管只是其中一个热键使用了波浪号:</p>
<pre>~RButton &amp; LButton::信息框 "You pressed the left mouse button while holding down the right."
RButton &amp; WheelUp::信息框 "You turned the mouse wheel up while holding down the right button."</pre>
<p><a href="commands/Suspend.htm">挂起</a> 函数可以临时禁用所有的热键, 但不包括您要排除的那些. 要获得更高的选择性, 请使用 <a href="commands/_HotIf.htm">#动态判断</a>.</p>
<p>通过使用 <a href="commands/Hotkey.htm">热键</a> 函数, 可以在脚本运行时动态创建热键. 热键 函数还可以单独修改, 禁用或启用脚本的现有热键.</p>
<p>操纵杆热键当前不支持修饰符前缀(如 ^(<kbd>Control</kbd>) 和 #(<kbd>Win</kbd>)). 但是, 您可以使用 <a href="commands/GetKeyState.htm">获取按键状态</a> 来模拟此效果, 如下例所示:</p>
<pre>Joy2::
{
    如果 not 获取按键状态(&quot;Control&quot;)  <em>; 左边和右边的 Control 键都没有按下.</em>
        返回  <em>; 即什么都不做.</em>
    信息框 "You pressed the first joystick's second button while holding down the Control key."
}</pre>
<p>热键在继续之前可能需要等待自己的修饰键被释放. 请参考下面的例子:</p>
<pre>^!s::发送 "{Delete}"</pre>
<p>按下 <kbd>Control</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd> 会让系统以为您按下了 <kbd>Control</kbd>+<kbd>Alt</kbd>+<kbd>Delete</kbd>(由于系统对 <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Delete</kbd> 的侵略性检测). 要解决此问题, 请使用 <a href="commands/KeyWait.htm">等待按键</a> 来等待按键释放; 例如:</p>
<pre>^!s::
{
    等待按键 "Control"
    等待按键 "Alt"
    发送 "{Delete}"
}
</pre>
<p>如果形如 <code>#z::</code> 这样的热键产生了类似 &quot;Invalid 热键(无效热键)&quot; 的错误, 那么您的系统键盘布局/语言可能不包含指定的字符(本例中为 &quot;Z&quot;). 尝试使用您键盘布局中您知道存在的其他字符.</p>
<p>只有在函数被命名的情况下, 脚本才能明确地调用热键的函数. 请参阅<a href="#Function">命名的函数热键</a>.</p>
<p>热键的一个常见用途是启动和停止重复的动作, 例如一系列的键击或鼠标点击. 关于这方面的例子, 请参阅<a href="FAQ.htm#repeat">这个 FAQ 主题</a>.</p>
<p>最后, 每个脚本都是<a href="misc/Threads.htm">准多线程的</a>, 这样可以在之前的热键子程序还在运行时启动新的热键. 例如, 即使在当前热键显示 <a href="commands/MsgBox.htm">信息框</a> 时也能启动新的热键.</p>

<h2 id="AltTabDetail">Alt-Tab 热键</h2>
<p>每个 Alt-Tab 热键必须是两个键的组合, 通常通过 &amp; 符号实现. 在以下示例中, 您将按住右 <kbd>Alt</kbd> 键并按下 <kbd>J</kbd> 或 <kbd>K</kbd> 以导航 alt-tab 菜单:</p>
<pre>RAlt &amp; j::AltTab
RAlt &amp; k::ShiftAltTab</pre>
<p><em>AltTab</em> 和 <em>ShiftAltTab</em> 是两个特殊的命令, 只有在与热键在同一行上时才能被识别. 这里是完整的列表:</p>
<p><strong>AltTab</strong>: 如果 alt-tab 菜单可见, 那么在菜单中前移. 否则, 显示菜单(仅当热键是 "&amp;" 连接的两个按键时; 否则, 它什么都不做).</p>
<p><strong>ShiftAltTab</strong>: 与上面相同, 只是在菜单中向后移动.</p>
<p><strong>AltTabAndMenu</strong>: 如果 alt-tab 菜单可见, 则向前移动. 否则, 显示菜单.</p>
<p><strong>AltTabMenu</strong>: 显示或隐藏 alt-tab 菜单.</p>
<p><strong>AltTabMenuDismiss</strong>: 关闭 Alt-tab 菜单.</p>
<p>为了说明上述内容, 可以用鼠标滚轮完全代替 Alt-tab. 使用下面的热键, 点击鼠标中键显示菜单, 转动滚轮在菜单中导航:</p>
<pre>MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab</pre>
<p>要取消热键调用的Alt-tab菜单而不激活所选窗口, 请使用如下所示的热键. 可能需要进行调整, 具体取决于: 1) 最初显示 alt-tab 菜单的方式; 和 2) 脚本是否安装了<a href="commands/_InstallKeybdHook.htm">键盘钩子</a>.</p>
<pre>LCtrl &amp; CapsLock::AltTab
<strong>!</strong>MButton::  <em>; 鼠标中键. <strong>!</strong> 前缀让它在按住 Alt 键时激发(当 alt-tab 菜单可见时, alt 键是按住的).</em>
{
    如果 窗口存在("ahk_class #32771")  <em>; 表示 alt-tab 菜单出现在屏幕上.</em>
        发送 "<strong>!</strong>{Escape}{Alt up}"
}</pre>
<p>当前, 所有特殊的 Alt-tab 动作必须像上面的例子那样直接指定到热键上(即它们无法像函数那样使用). 它们<span class="red">不受 <a href="commands/_HotIf.htm">#动态判断</a> 的影响</span>.</p>
<p>也可以通过热键创建自定义 alt-tab 的动作. 在下面的示例中, 您可以按下 <kbd>F1</kbd> 显示菜单并在其中向前移动. 然后可以按下 <kbd>F2</kbd> 来激活选择的窗口(或按下 <kbd>Escape</kbd> 来取消):</p>
<pre>*F1::发送 "{Alt down}{tab}" <em>; 在这种情况下需要星号.</em>
!F2::发送 "{Alt up}"  <em>; 释放 Alt 键, 激活选择的窗口.</em>
~*Escape::
{
    如果 窗口存在("ahk_class #32771")
        发送 "{Escape}{Alt up}"  <em>; 取消菜单而不激活选择的窗口.</em>
}</pre>

<h2 id="Function">命名的函数热键</h2>
<p>如果需要在不触发热键本身的情况下调用热键的函数, 则可以为一个或多个热键分配一个命名的<a href="Functions.htm">函数</a>, 只需在热键的双冒号之后简单地定义该函数即可, 例如:</p>
<pre><em>; Ctrl+Shift+O 在资源管理器中打开包含的文件夹.
; Ctrl+Shift+E 打开文件夹并选中当前编辑的文件.
; 支持 SciTE 和 Notepad++.</em>
^+o::
^+e::
    editor_open_folder()
    {
        path := 获取窗口标题("A")
        如果 正则匹配(path, "\*?\K(.*)\\[^\\]+(?= [-*] )", path)
            如果 (文件是否存在(path[0]) &amp;&amp; ThisHotkey = "^+e")
                运行 格式化字符串('explorer.exe /select,"{1}"', path[0])
            否则
                运行 格式化字符串('explorer.exe "{1}"', path[1])·
    }</pre>
<p id="function-details">热字串也可以这样定义. 可以将多个热键或热字串堆叠在一起以调用同一个函数.</p>
<p>在热键/热字符串和函数之间只能有空格或注释.</p>
<p>命名函数还支持自我描述热键, 就像上面的代码其中函数名称描述了热键那样.</p>
<p><a href="commands/Hotkey.htm">热键</a> 函数也可以关联函数或函数对象到一个热键.</p>

</body>
</html>